package com.ppblock.shirox.core;

import com.ppblock.shirox.core.impl.AuthenticationInfoEntity;
import com.ppblock.shirox.surpport.ShiroxPermission;
import com.ppblock.shirox.surpport.ShiroxConfigure;

import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * 授权认证管理接口
 * @author yangjian
 * @since 2017/12/6
 */
public interface SubjectManager {

	/**
	 * 授权信息 session 存储 key
	 */
	String AUTHORIZE_INFO_SESSION_KEY = "SHIROX_AUTHORIZE_INFO";

	/**
	 * 认证信息 session 存储 key
	 */
	String AUTHEN_INFO_SESSION_KEY = "SHIROX_AUTHEN_INFO";

	/**
	 * 绑定 HttpSession
	 * @param session
	 */
	public void bindSession(HttpSession session);

	/**
	 * 登入
	 * @param token
	 */
	void login(AuthenticationToken token);

	/**
	 * 登出
	 */
	void logout();

	/**
	 * 是否已经被授权认证(是否已经登录)
	 * @return
	 */
	boolean isAuthorized();

	/**
	 * 判断某个操作是否有权限(基于普通 String)
	 * @param operation
	 * @return
     */

	boolean hasPermission(String operation);

	/**
	 * 判断某个操作是否有权限(基于 ShiroxPermission 接口)
	 * @param permission
	 * @return
	 */
	boolean hasPermission(ShiroxPermission permission);

	/**
	 * 判断某一组操作是否有权限,取并集(只要有一个操作有权限则返回 true)
	 * @param permissions
	 * @return
     */
	boolean hasAnyPermissions(List permissions);

	/**
	 * 判断某一组操作是否有权限,取交集(只要有一个操作没有权限,则返回 false)
	 * @param permissions
	 * @return
     */
	boolean hasAllPermissions(List permissions);

	/**
	 * 获取身份认证信息，这里包含了所有域返回的身份认证信息。
	 * 如果你只使用了一个域(Realm), 直接调用 #getPrimaryAuthenticationInfo() 就好了。
	 * @return
	 */
	public AuthenticationInfoEntity getAuthenticationInfo();

	/**
	 * 获取主要域的身份认证信息
	 * @return
	 */
	public AuthenticationInfo getPrimaryAuthenticationInfo();

	/**
	 * 获取授权信息
	 * @return
	 */
	public AuthorizationInfo getAuthorizationInfo();

	/**
	 * 获取 shirox 配置信息
	 * @return
	 */
	public ShiroxConfigure getShiroxConfigure();

	/**
	 * 注入 shirox 配置信息
	 * @param shiroxConfigure
	 */
	public void setShiroxConfigure(ShiroxConfigure shiroxConfigure);
}
